﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


public partial class 压缩 : System.Web.UI.Page
{
    /// <summary>
    /// 
    /// </summary>
    private string 压缩文件 = "compress.dbc";
    protected void Page_Load(object sender, EventArgs e)
    {
        //测试
        解压缩文件();


        try
        {
            var comFilePath = Server.MapPath(压缩文件);
            byte[] bytes = System.IO.File.ReadAllBytes(comFilePath);
            //压缩的字节流
            System.IO.MemoryStream msComperss = new System.IO.MemoryStream(bytes);
            //压缩流
            System.IO.Compression.DeflateStream deflate = new System.IO.Compression.DeflateStream(msComperss, System.IO.Compression.CompressionMode.Decompress);



            bool canRun = true;
            byte[] arr = new byte[2048];

            int n = deflate.Read(arr, 0, arr.Length);
            var result = arr.Take(n);
            System.IO.File.WriteAllBytes(Server.MapPath("./aaa.txt"), result.ToArray());
        }
        catch (Exception ex)
        {
            Response.Write("-------<br/>.net内部库解压缩文件失败" + ex);
        }

    }

    private void 解压缩文件()
    {
        var comFilePath = Server.MapPath(压缩文件);



        byte[] bytes = System.IO.File.ReadAllBytes(comFilePath);



        var result = DCompress(bytes);
        var by2 = Decompress(bytes);

        System.IO.File.WriteAllBytes(Server.MapPath("./aaa1.txt"), result.ToArray());


        Response.Write("ICSharpCode.SharpZipLib.Zip解压缩文件成功" + 压缩文件 + "....");

    }

    /// <summary>
    /// 输入要解压缩的字节数组 返回解压缩后的字节数组
    /// </summary>
    /// <param name="inputByteArray">要解压缩的字节数组</param>
    /// <returns>返回解压缩后的字节数组</returns>
    public static byte[] DCompress(byte[] inputByteArray)
    {


        Inf = new ICSharpCode.SharpZipLib.Zip.Compression.Inflater(false);
        if (inputByteArray.Length <= 0)
        {
            return null;
        }
        //重新还原到原始状态
        Inf.Reset();
        Inf.SetInput(inputByteArray);
        //解 Deflater 压缩的文件 这里指定最高压缩可能为 0.5%
        byte[] infarr = new byte[inputByteArray.Length * 200];

        int inflen = Inf.Inflate(infarr);
        byte[] result = new byte[inflen];
        System.Buffer.BlockCopy(infarr, 0, result, 0, result.Length);


        return result;
    }


    /// <summary>
    /// 输入要解压缩的字节数组 返回解压缩后的字节数组
    /// </summary>
    /// <param name="inputByteArray">要解压缩的字节数组</param>
    /// <returns>返回解压缩后的字节数组</returns>
    public static byte[] Decompress(byte[] inputByteArray)
    {
        var inflater = new ICSharpCode.SharpZipLib.Zip.Compression.Inflater(false);
        if (inputByteArray.Length <= 0)
        {
            return null;
        }
        //重新还原到原始状态
        //inflater.Reset();
        inflater.SetInput(inputByteArray);
        //解 Deflater 压缩的文件用的缓冲区
        var infarr = new byte[2048];
        //循环从流中读取数据
        using (var sr = new MemoryStream())
        {
            int inflen;
            while ((inflen = inflater.Inflate(infarr)) > 0)
            {
                sr.Write(infarr, 0, inflen);
            }
            sr.Flush();
            //GetBuffer 是把 stream 中的 buffer 的引用传递出来， buffer 的大小是由 stream的 Capacity来决定的。 因为只是地址的引用传递，所以 GetBuffer() 速度很快，但是却把 很多没用到的 空数据做占用的地址空间也传递出来了。
            //ToArray() 是 将 MemoryStream的 数据复制到一个 byte[] 中，因此速度要比 GetBuffer() 慢，但是它不会将无用的空数据放在 byte[] 中
            var result = sr.ToArray();
            sr.Close();
            return result;
        }
    }


    #region Defa压缩解压算法 变量定义
    /// <summary>
    /// 用于对字节进行压缩的 算法实体
    /// </summary>
    /// <![CDATA[
    ///         //用 Deflater 压缩文件
    ///byte[] defoutPut = new byte[CurrentFileByte.Length];
    ///ICSharpCode.SharpZipLib.Zip.Compression.Deflater def = new ICSharpCode.SharpZipLib.Zip.Compression.Deflater( ICSharpCode.SharpZipLib.Zip.Compression.Deflater.DEFAULT_COMPRESSION, false);
    ///def.SetInput(CurrentFileByte);
    ///def.Flush();
    ///int len=  def.Deflate(defoutPut);
    /// ]]>
    static ICSharpCode.SharpZipLib.Zip.Compression.Deflater Def = new ICSharpCode.SharpZipLib.Zip.Compression.Deflater(ICSharpCode.SharpZipLib.Zip.Compression.Deflater.DEFAULT_COMPRESSION, false);



    /// <summary>
    /// 解 Deflater 压缩的文件 的算法实体
    /// </summary>
    static ICSharpCode.SharpZipLib.Zip.Compression.Inflater Inf = new ICSharpCode.SharpZipLib.Zip.Compression.Inflater(false);

    /// <summary>
    /// 用于 lock 语句以关键字 lock 开头，它有一个作为参数的对象，在该参数的后面还有一个一次只能由一个线程执行的代码块
    /// </summary>
    private static System.Object lockThis = new System.Object();


    #endregion





}